package com.hsurosy.hsuchain.nft.lock;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 分布式锁注解
 *
 * @Author Hsu琛君珩
 * @Date 2024-10-05 4:39
 * @Description
 * @Version: v1.0.0
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface DistributeLock {

    /**
     * 锁的场景
     * <p>
     * 表示当前加锁的场景，比如用户操作、订单处理等，用于标识不同的业务场景。
     * </p>
     *
     * @return 场景名称
     */
    public String scene();

    /**
     * 加锁的key，优先取key()，如果没有，则取keyExpression()
     * <p>
     * 表示分布式锁的唯一标识，通常与具体的业务实体（如用户ID、订单ID）相关。
     * </p>
     *
     * @return 锁的唯一标识key
     */
    public String key() default DistributeLockConstant.NONE_KEY;

    /**
     * SPEL表达式
     * <p>
     * 用于动态生成锁的 key，支持 SpEL 表达式（Spring Expression Language）。
     * 例如:
     * <pre>
     *     #id
     *     #insertResult.id
     * </pre>
     * 如果 key() 没有定义，则使用该表达式生成锁的 key。
     * </p>
     *
     * @return 锁的key的SpEL表达式
     */
    public String keyExpression() default DistributeLockConstant.NONE_KEY;

    /**
     * 超时时间，毫秒
     * <p>
     * 表示锁的过期时间，单位为毫秒。默认为自动续期模式（不设置超时时间），在此模式下锁会自动延续。
     * </p>
     *
     * @return 锁的过期时间（毫秒）
     */
    public int expireTime() default DistributeLockConstant.DEFAULT_EXPIRE_TIME;

    /**
     * 加锁等待时长，毫秒
     * <p>
     * 表示等待获取锁的时间，单位为毫秒。默认不设置等待时间，即不等待直接返回。
     * </p>
     *
     * @return 等待时长（毫秒）
     */
    public int waitTime() default DistributeLockConstant.DEFAULT_WAIT_TIME;
}
